#!/bin/bash

# 当前脚本的绝对路径
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)

# 备份输出的根目录（需配置）
BACKUP_ROOT=/db_backup
# 判断备份路径是否存在（不存在则新建）
if [ ! -d $BACKUP_ROOT ]
then
        mkdir -p $BACKUP_ROOT
fi

# 日期
DATE=$(date +%Y%m%d)

# 需要备份的数据日期（约定：前一周）
DATA_DATE=$(date -d "-1 week" +%F)
DATA_Ymd=$(date -d "-1 week" +%Y%m%d)

# 生产库主机地址（需配置）
HOST=35.24.100.1

# 生产库MYSQL数据库监听端口号（默认3306）
PORT=3308

# 生产库用户名（需配置）
USER=root
# 生产库密码（需配置）
PW=L5x@yHPvKLW2
# 生产库（需配置,多个备份库用空格分隔）
DB_LIST=("db_oil_pvg" "db_oil_doy" "db_oil_jng" "db_oil_lyi" "db_oil_riz" "db_oil_wef"  "db_oil_hza")

# 历史库主机地址（需配置）
HOST_HIS=35.24.100.13

# 历史库MYSQL数据库监听端口号（默认3306）
PORT_HIS=3308

# 历史库用户名（需配置）
USER_HIS=root
# 历史库密码（需配置）
PW_HIS=2RxG@A96myfq

# 生产库数据备份路径（需配置）
DIR_DATA=$BACKUP_ROOT/data
# 判断生产库数据备份路径是否存在（不存在则新建）
if [ ! -d $DIR_DATA ]
then
	mkdir -p $DIR_DATA
fi

# 日志文件保存路径（需配置）
DIR_LOG=$BACKUP_ROOT/logs
# 判断日志文件保存路径是否存在（不存在则新建）
if [ ! -d $DIR_LOG ]
then
	mkdir -p $DIR_LOG
fi

echo -e "需要备份的数据库列表:"
n=${#DB_LIST[@]}
#echo $n
for ((i=0;i<n;i++))
do
	echo ${DB_LIST[i]}
done

#配置通用命令
MYSQL_DB="mysql -h$HOST -P$PORT -u$USER -p$PW -N"
MYSQL_DB_HIS="mysql -h$HOST_HIS -P$PORT_HIS -u$USER_HIS -p$PW_HIS -N"
MYSQLDUMP_DB="mysqldump -h$HOST -P$PORT -u$USER -p$PW"
MYSQLDUMP_DB_HIS="mysqldump -h$HOST_HIS -P$PORT_HIS -u$USER_HIS -p$PW_HIS"

FILE_LOG_INFO=$DIR_LOG/$DATE.log

echo -e "\n数据备份开始...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO

# 开始逐个备份数据库
for ((i=0;i<n;i++))
do
	# 当前正在备份数据库
	DB=${DB_LIST[i]}
	
	# 历史库（约定：生产库名+"_his_"+当前备份时间对应的年份YYYY）
	DB_HIS=$DB"_his_"$(date '+%Y')
	echo -e "\n开始将生产库[$DB]备份到历史库[$DB_HIS]...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	
	# 备份数据库目录
	DIR_DATA_DB=$DIR_DATA/$DB
	# 判断生产库数据备份路径是否存在（不存在则新建）
	if [ ! -d $DIR_DATA_DB ]
	then
		mkdir -p $DIR_DATA_DB
	fi
	
	# 建立日志数据库目录
	#DIR_LOG_DB=$DIR_LOG/$DB
	# 判断日志文件保存路径是否存在（不存在则新建）
	#if [ ! -d $DIR_LOG_DB ]
	#then
	#	mkdir -p $DIR_LOG_DB
	#fi
	
	# 1、判断当前要备份的生产数据库是否存在
	num=$($MYSQL_DB -e"SELECT COUNT(*) AS num FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='$DB'")
	if [ $num -eq 0 ]
	then
		echo "数据库[$DB]在服务器[$HOST]上不存在，备份终止...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
		exit
	fi
	
	# 2、判断当前要备份的历史数据库是否存在
	num=$($MYSQL_DB_HIS -e"SELECT COUNT(*) AS num FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='$DB_HIS'")
	if [ $num -eq 0 ]
	then
        	echo "数据库[$DB_HIS]在服务器[$HOST_HIS]上不存在" | tee -a $FILE_LOG_INFO
		echo "正在备份服务器[$HOST_HIS]上新建历史数据库[$DB_HIS]...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
		SQL="CREATE DATABASE IF NOT EXISTS $DB_HIS default charset utf8 COLLATE utf8_general_ci"
		$MYSQL_DB_HIS -e"$SQL"
		if [ $? -eq 0 ]
        	then
                	echo "在备份服务器[$HOST_HIS]上新建历史数据库[$DB_HIS]成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
        	else
                	echo "在备份服务器[$HOST_HIS]上新建历史数据库[$DB_HIS]失败，备份终止...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
                	exit
	        fi
		echo "正在导出数据库[$DB]的表结构...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
		DB_INFO=$DIR_DATA_DB/$DB.sql
		$MYSQLDUMP_DB -d $DB > $DB_INFO
		if [ $? -eq 0 ]
		then
			echo "导出数据库[$DB]的表结构成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
		else
			echo "导出数据库[$DB]的表结构失败，备份终止...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
			exit
		fi
		echo "正在导入数据库[$DB]的表结构到备份服务器[$HOST_HIS]的历史数据库[$DB_HIS]上...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
		$MYSQL_DB_HIS -D$DB_HIS < $DB_INFO
		if [ $? -eq 0 ]
        	then
                	echo "导入历史数据库[$DB_HIS]的表结构成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
        	else
                	echo "导入历史数据库[$DB_HIS]的表结构失败，备份终止...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
                	exit
        	fi
	fi
	
	# 3、判断当前备份表结构是否一致
	if [ $num -ne 0 ]
	then
		$SHELL_FOLDER/sync_table_structure.sh $HOST $PORT $USER $PW $DB $HOST_HIS $PORT_HIS $USER_HIS $PW_HIS $DB_HIS
		if [ $? -ne 0 ]
		then
			echo "同步生产库[$DB]的表结构失败，备份终止...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
			exit
		fi
	fi
	# 4、从生产库中导出当前备份表的数据
	FILE_DATA="$DIR_DATA_DB/$DB-$(date '+%Y%m%d%H%M%S').sql"
	#(1) 将长延误航班找出来
	delay_flag="delay"
	if [ "$DB" != "db_oil_pvg" ] # 航油项目干线生产库保留长延误航班，支线生产库不用保留长延误航班
	then
		delay_flag="delay1"  # 不用考虑延误航班，故将delay改成delay1使查询结果为空
	fi
	echo "正在查找长延误航班记录...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	sql="SELECT flseq FROM flightinfo WHERE delay_flag='$delay_flag' AND flop < '$DATA_Ymd'"
	tb_fkeys=$($MYSQL_DB -D$DB -e"$sql")
	echo -e "长延误航班唯一号列表:\n$tb_fkeys"
	FKEYS=""
	while read flseq
	do
		if [ ${#flseq} -eq 0 ]
		then
			break
		fi
		FKEYS+="'$flseq',"
	done< <(echo "$tb_fkeys")
	FKEYS=${FKEYS%?}
	echo $FKEYS
	echo "长延误航班记录查找结束...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	#(2) 按航班日（flop）和长延误标识（delay_flag）导出航班数据
	table_1="flightinfo"
	where_1="flop < '$DATA_Ymd' AND delay_flag != '$delay_flag'"
	tb_arr=(${table_1})
	for TB in ${tb_arr[@]}
        do
                echo -e "\n正在导出数据库[$DB]表[$TB]的数据...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
		$MYSQLDUMP_DB --insert-ignore $DB -t -c -w" $where_1" $TB >> $FILE_DATA
		echo "数据库[$DB]表[$TB]的数据导出成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	done
	#(3) 按航班日（flop）和航班唯一号（flseq）导出相关表数据
	table_2="flight_change flight_data flight_oil_info flight_subscribe flight_update_field flseq_interface_tenant oil_bill oil_bill_history srv_flight"
	where_2="flop < '$DATA_Ymd'"
	if [ -n "$FKEYS" ]     
	then
		where_2="$where_2 AND flseq NOT IN($FKEYS)"
	fi
	tb_arr=(${table_2})
	for TB in ${tb_arr[@]}
        do
                echo -e "\n正在导出数据库[$DB]表[$TB]的数据...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
		$MYSQLDUMP_DB --insert-ignore $DB -t -c -w" $where_2" $TB >> $FILE_DATA
		echo "数据库[$DB]表[$TB]的数据导出成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	done
	#(4) 按航班日（flop）和航班唯一号（fkey）导出相关表数据
	table_3="agdis_bill_curr agdis_bill_info agdis_bill_li agdis_bill_ls agdis_bill_oli agdis_bill_proc agdis_bill_sgin agdis_bill_view rsub_prenotice srv_alarm srv_applytask srv_prenotice srv_pretask srv_pushmessage srv_service srv_servicemark srv_serviceprocess srv_servicestandard srv_task srv_task_forward srv_task_transfer srv_taskmark srv_taskprocess workingmsg"
	where_3="flop < '$DATA_Ymd'"
	if [ -n "$FKEYS" ]
        then
		where_3="$where_3 AND fkey NOT IN($FKEYS)"
	fi
	tb_arr=(${table_3})
	for TB in ${tb_arr[@]}
        do
                echo -e "\n正在导出数据库[$DB]表[$TB]的数据...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
		$MYSQLDUMP_DB --insert-ignore $DB -t -c -w" $where_3" $TB >> $FILE_DATA
		echo "数据库[$DB]表[$TB]的数据导出成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	done
	#(5) 按创建日期导出的表数据
	table_4="agdis_message"
	where_4="CTIME < '$DATA_DATE'"
	tb_arr=(${table_4})
	for TB in ${tb_arr[@]}
	do
		echo -e "\n正在导出数据库[$DB]表[$TB]的数据...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
        	$MYSQLDUMP_DB --insert-ignore $DB -t -c -w" $where_4" $TB >> $FILE_DATA
		echo "数据库[$DB]表[$TB]的数据导出成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	done
	#(6) 按航班日导出的表数据
	table_5="workingmsgfd"
	where_5="SWITCHFLOP < '$DATA_Ymd'"
	tb_arr=(${table_5})
	for TB in ${tb_arr[@]}
	do
		echo -e "\n正在导出数据库[$DB]表[$TB]的数据...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
        	$MYSQLDUMP_DB --insert-ignore $DB -t -c -w" $where_5" $TB >> $FILE_DATA
		echo "数据库[$DB]表[$TB]的数据导出成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	done
	#(7) 按创建日期导出的表数据
        table_6="oil_volume_alarm tnb_mapping"
        where_6="create_time < '$DATA_DATE'"
        tb_arr=(${table_6})
        for TB in ${tb_arr[@]}
        do
                echo -e "\n正在导出数据库[$DB]表[$TB]的数据...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
                $MYSQLDUMP_DB --insert-ignore $DB -t -c -w" $where_6" $TB >> $FILE_DATA
                echo "数据库[$DB]表[$TB]的数据导出成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
        done
	#(8) 按航班日（flop）和航班唯一号（afleq、dfleq）导出相关表数据
        table_7="flight_united_flight"
        where_7="flop < '$DATA_Ymd'"
        if [ -n "$FKEYS" ]
        then
                where_7="$where_7 AND (afleq NOT IN($FKEYS) OR dfleq NOT IN($FKEYS))"
        fi
        tb_arr=(${table_7})
        for TB in ${tb_arr[@]}
        do
                echo -e "\n正在导出数据库[$DB]表[$TB]的数据...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
                $MYSQLDUMP_DB --insert-ignore $DB -t -c -w" $where_7" $TB >> $FILE_DATA
                echo "数据库[$DB]表[$TB]的数据导出成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
        done
	echo "生产库[$DB]数据全部导出完成...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	# 5、在历史库中导入当前备份表的数据
	if [ -f $FILE_DATA ]
	then
        	echo -e "\n正在将生产库[$DB]备份出来的数据导入到备份库[$DB_HIS]中...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
        	$MYSQL_DB_HIS -D$DB_HIS < $FILE_DATA
        	if [ $? -ne 0 ]
        	then
                	echo "将生产库[$DB]备份出来的数据导入到备份库[$DB_HIS]失败,备份终止...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
                	exit
        	fi
        	echo "将生产库[$DB]备份出来的数据导入到备份库[$DB_HIS]已完成...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	else
        	echo "生产库[$DB]没有满足备份条件的记录，无需备份...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	fi
	
	# 6、从生产库中删除已经备份出来的数据
	echo -e "\n正在删除生产库[$DB]中已经备份到备份库的记录...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
	where_count=7 #以上备份条件的分类数量，如果新增或者减少备份分类，这个值要做相应调整
	for ((k=1;k<=$where_count;k++))
	do
		where_delete=$(eval echo '$'where_$k)
		table_delete=$(eval echo '$'table_$k)
		#echo $table_delete
		tb_arr=($table_delete)
		for TB in ${tb_arr[@]}
		do
			# 油单表oil_bill和oil_bill_history只做备份不做删除
			if [[ "$TB" != "oil_bill" && "$TB" != "oil_bill_history" ]]
			then
				echo -e "\n正在删除生产库[$DB]表[$TB]中已经备份到备份库的记录...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
				sql_delete="delete from $TB where $where_delete"
				echo $sql_delete
				$MYSQL_DB -D$DB -e "$sql_delete"
				if [ $? -ne 0 ]
				then
					echo "删除生产库[$DB]表[$TB]中已经备份到备份库的记录失败...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
				fi
				echo "删除生产库[$DB]表[$TB]中已经备份到备份库的记录成功...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
			fi
		done
	done
	echo -e "\n删除生产库[$DB]中已经备份到备份库的记录完成...$(date '+%Y-%m-%d %H:%M:%S')" | tee -a $FILE_LOG_INFO
done

#echo -e "\n数据备份结束...$(date '+%Y-%m-%d %H:%M:%S')\n"

echo -e "\n正在遍历删除过期的备份数据文件...$(date '+%Y-%m-%d %H:%M:%S')\n" | tee -a $FILE_LOG_INFO
flop=$(date +%Y%m%d -d "-3 day")
# 遍历指定目录下的所有文件（包括子文件夹）
function read_dir(){
        for file in `ls $1` #注意此处这是两个反引号，表示运行系统命令
        do
                if [ -d $1"/"$file ] #注意此处之间一定要加上空格，否则会报错
                then
                        read_dir $1"/"$file
                else
                        echo $1"/"$file #在此处处理文件即可
                fi
        done
}

# 调用遍历函数
find_list=($(read_dir $BACKUP_ROOT))
for file in ${find_list[@]}
do
        file_date=$(echo $file | cut -d - -f 2 | cut -d . -f 1)
        is_number=$(echo $file_date | grep [^0-9] > /dev/null && echo "no" || echo "yes")
        #echo $is_number
        if [ $is_number != "no" ]
        then
                if [ $file_date \< $flop ]
                then
                        echo $file
			rm -f $file
                fi
        fi
done
echo -e "\n遍历删除过期的备份数据文件完成...$(date '+%Y-%m-%d %H:%M:%S')\n" | tee -a $FILE_LOG_INFO

echo -e "\n数据备份结束...$(date '+%Y-%m-%d %H:%M:%S')\n" | tee -a $FILE_LOG_INFO
